# xpath解析：最常用的且最便捷的高效的一种解析方式。通用性。
#
# xpath 解析原理：
#       - 1. 实例化一个 etree 的对象，且需要将被解析的页面源码数据加载到该对象中。
#       - 2. 调用 etree 对象中的 xpath 方法结合 xpath 表达式，实现标签的定位和内容的捕获。

#   - 环境安装：
#       - pip install lxml

#   - 如何实例化一个 etree 对象：
#       - from lxml import etree
#       - 1. 可以将本地的 html 文档中的源码数据，加载到 etree 对象中：etree.parse(filePath)
#       - 2. 可以将从互联网上获取的源码数据加载到该对象中：etree.HTML('page_text')

#   - xpath('xpath表达式')
#       - /：表示的是从根节点开始定位。表示第一个层级
#       - //：表示的是多个层级。
#       - 属性定位：//a[@href="dapao"]    表示属性的筛选
#       - 获取文本：
#           - /text(): 获取的是标签中知悉的文本内容
#           - //text(): 标签中非直系的文本内容（所有的文本内容）
#       - 获取属性：
#           - /@attrName      //a/@href

from lxml import etree

if __name__ == '__main__':
    # 实例化好了一个 etree 对象，且将被解析的源码加载到了该对象中
    tree = etree.parse('./爬取文件/1.html')
    # xpath表达式: "/" 表示根节点
    r = tree.xpath('/html/head/title/text()')[0]
    print(r)

    # //：表示的是多个层级。
    result0 = tree.xpath('/html//a/text()')
    print(result0)

    # //：表示的是多个层级。从源码中任意位置寻找 a 标签
    result1 = tree.xpath('//a/text()')
    print(result1)

    # result = tree.xpath('/html')
    # result = tree.xpath('/html/body/ul/li/a/text()')
    # result = tree.xpath('/html/body/ul/li[1]/a/text()')     # xpath 的顺序是从1开始计数的，[] 表示索引
    # result = tree.xpath('/html/body/ol/li/a[@href="dapao"]/text()')     # [@xxx=xxx] 表示属性的筛选

    ol_li_list = tree.xpath('/html/body/ol/li')
    for li in ol_li_list:
        # 从每一个 li 中提取到文字信息
        text = li.xpath('./a/text()')  # 在 li 中继续去寻找，相对寻找
        print(text)

        result2 = li.xpath('./a/@href')  # 拿到属性值，通过 @属性名
        print(result2)

    # 拿取 ul 中的所有链接
    print(tree.xpath('/html/body/ul/li/a/@href'))

